package com.jt.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.jt.pojo.User;
import com.jt.service.DubboUserService;
import com.jt.service.UserService;
import com.jt.vo.SysResult;
import org.apache.zookeeper.Op;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;


/**
 * @Author: Li Yu
 * @Date: 2020/11/16 17:01
 */
@Controller
@RequestMapping("/user/")
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private JedisCluster jedisCluster;

    @Reference(check = false) //启动消费者是不去校验是否有生产者
    private DubboUserService dubboUserService;

    /**
     * url1: http://www.jt.com/user/register.html
     * url1: http://www.jt.com/user/login.html
     * @param moduleName
     * @return
     */
    @RequestMapping("{moduleName}")
    public String module(@PathVariable String moduleName){
        return moduleName;
    }

    @RequestMapping("testHttpClient")
    @ResponseBody
    public List<User> testHttpClient(){
        return userService.testHttpClient();
    }

    /**
     * 完成用户注册功能
     * url：/user/doRegister
     *
     * @param user
     * @return
     */
    @RequestMapping("doRegister")
    @ResponseBody
    public SysResult doRegister(User user){
        //用户入库操作，利用dubbo进行RPC调用
        dubboUserService.saveUser(user);
        return SysResult.success();
    }

    /**
     * 业务：完成用户登录操作
     * url地址：www.jt.com/user/doLogin?r=0.3585564564645
     * @param user
     *          username：admin123
     *          password：admin123456
     * @return SysResult对象
     * 具体业务实现：
     *          1.检验用户名和密码是否正确
     *          2.判断返回值结果是否为null，用户名和密码有误，返回201状态码
     *          3.如果返回值结果不为空 ，uuid保存到cookie中
     * cookie的知识介绍：
     *          1.cookie.setPath("/")   url在哪个目录生效 /根目录
     *          url1：  www.jt.com/addUser
     *          url2:   www.jt.com/user/addUser
     *          2.cookie.setDomain("域名地址");cookie在哪个域名中共享
     *          例子：cookie.setDomain("manage.jt.com");
     *              只有在manage.jt.com有效
     *              cookie.setDomain("jt.com");
     *              只有在jt.com结尾的域名有效
     */
    @RequestMapping("doLogin")
    @ResponseBody
    public SysResult doLogin(User user, HttpServletResponse response){
        //调用业务层获取uuid
        String uuid=dubboUserService.doLogin(user);
        //判断uuid是否为空
        if (StringUtils.isEmpty(uuid)){
            //如果uuid为空返回失败
            return SysResult.fail();
        }
        //new一个cookie将cookie保存到Cookie中
        Cookie cookie=new Cookie("JT_TICKET", uuid);
        //让cookie30天有效
        cookie.setMaxAge(30*24*60*60);
        //让cookie在哪个根目录下有效
        cookie.setPath("/");
        //让cookie在和后缀为jt.com的域名共享
        cookie.setDomain("jt.com");
        //上传cookie
        response.addCookie(cookie);
        //返回业务执行成功
        return SysResult.success();
    }
    /**
     * 完成用户退出操作
     * url：www.jt.com/user/logout
     * 参数：
     * 返回值：
     * 业务：
     *  1.删除redis   K-V 根据key 获取ticket信息
     *  2.删除cookie  根据name
     */
    @RequestMapping("logout")
    public String logout(HttpServletRequest request,HttpServletResponse response){
        //1.获取cookie中的JT_TICKET的值
        Cookie [] cookies=request.getCookies();
        if (cookies!=null&&cookies.length>0){
            for (Cookie cookie:cookies){
                if (cookie.getName().equals("JT_TICKET")){
                    String ticket=cookie.getValue();
                    jedisCluster.del(ticket);
                    //0表示立即删除
                    cookie.setMaxAge(0);
                    //规则cookie如果要进行操作，必须严格定义
                    cookie.setPath("/");
                    cookie.setDomain("jt.com");
                    response.addCookie(cookie);
                }
            }
        }
        return "redirect:/";
    }

}
